#include "gerenciadorFiguras.h"
#include <iostream>
#include <string>

using namespace std;

/********************************************************/
/********************************************************/
/*                     GERENCIADOR                      */
/*                                                      */

// Construtor de gerencyFig
gerencyFig::gerencyFig(){
    this->List = new list;
}


// Adicionar figura
void gerencyFig::addFig(){
    int option;
    std::string lname;
    // Declara e instancia o novo no
    //node *new_node = new node;
    fig *figura;
    
    cout<<"Digite o tipo de figura: "<<endl;
    cout<<"1) Esfera"<<endl;
    cout<<"2) Cubo"<<endl;
    cout<<"3) Cilindro"<<endl;
    cout<<"4) Tetraedro"<<endl;
    cin>>option;
    switch(option){
        case 1:
            float raio;
            cout<<"Digite o nome da esfera: "<<endl;
            cin>>lname;
            cout<<"\nDigite o raio da esfera: "<<endl;
            cin>>raio;
            // Instancia nova esfera
            figura = new esfera(lname,raio);
            break;
            
        case 2:
            float aresta;
            cout<<"Digite o nome do cubo: "<<endl;
            cin>>lname;
            cout<<"Digite o valor da aresta do cubo: "<<endl;
            cin>>aresta;
            // Instancia novo cubo
            figura = new cubo(lname,aresta);
            break;
            
        case 3:
            float raio_base,alturaCil;
            cout<<"Digite o nome do cilindro: "<<endl;
            cin>>lname;
            cout<<"Digite o valor do raio da base do cilindro: "<<endl;
                cin>>raio_base;  // raio_base
            cout<<"\nDigite o valor da altura do cilindro: "<<endl;
                cin>>alturaCil;  // Altura
            // Instancia novo cilindro
            figura = new cilindro(lname, raio_base, alturaCil);
            break;
            
        case 4:
            float lado1, lado2, lado3, lado4, alturaTet;
            cout<<"Digite o nome do tetraedro: "<<endl;
            cin>>lname;
            cout<<"Digite o valor do lado 1 do triangulo da base: "<<endl;
            cin>>lado1;
            cout<<"\nDigite o valor do lado 2 do triangulo da base: "<<endl;
            cin>>lado2;
            cout<<"\nDigite o valor do lado 3 do triangulo da base: "<<endl;
            cin>>lado3;
            cout<<"\nDigite o valor da altura do tetraedro: "<<endl;
            cin>>alturaTet;
            figura = new tetraedro(lname, lado1, lado2, lado3, alturaTet);
            break;
            
        default:
            printf("Escolha invalida!\n");
            break;
    }

    this->List->inserir(figura);
    figura->calculaVolume();
}


// Listar figuras
void gerencyFig::showFig(){
    node *aux;
    for(aux=this->List->head.next;aux!=NULL;aux=aux->next){
        aux->figura->showMe();
    }
}



// REMOVER figura, tendo "nome" da figura como argumento
void gerencyFig::remFig(){
    std::string nome_r;
    cout << "Digite a figura a remover: " << endl;
    cin >> nome_r;
    this->List->removerFig(nome_r);
  
    
}

// Ordenar figura por nome
void gerencyFig::orderName(){
    node *aux1, *aux2;
    fig *figura1, *figura2;
    list *llist;
    int i=0, j=0;
    int inserido;
    
    if(this->List->vazia()) cout << "Lista vazia!\n" << endl;
    else {
        llist = new list;
        aux1=this->List->head.next;
        while(aux1!=NULL){
            i++;
            figura1=aux1->figura;
            aux2=llist->head.next;
            j=1;
            inserido=0;
            while(!inserido){
                if(aux2==NULL){
                    llist->inserirPosicao(figura1,j);
                    inserido=1;
                }
                else {
                    figura2=aux2->figura;
                    if(strcmp(aux2->figura->myName().c_str(),figura1->myName().c_str())>0){
                        llist->inserirPosicao(figura1,j);
                        inserido=1;
                    }
                    aux2=aux2->next;
                    j++;
                }
            }
            aux1=aux1->next;
        }
        this->List->head.next = llist->head.next;
    }
}



// Ordenar figura por volume
void gerencyFig::orderVolume(){
    node *aux1, *aux2;
    fig *figura1, *figura2;
    list *llist;
    int i=0, j=0;
    int inserido;
    
    if(this->List->vazia()) cout << "Lista vazia!\n" << endl;
    else {
        llist = new list;
        aux1=this->List->head.next;
        while(aux1!=NULL){
            i++;
            figura1=aux1->figura;
            aux2=llist->head.next;
            j=1;
            inserido=0;
            while(!inserido){
                if(aux2==NULL){
                    llist->inserirPosicao(figura1,j);
                    inserido=1;
                }
                else {
                    figura2=aux2->figura;
                    if(figura2->calculaVolume()>figura1->calculaVolume()){
                        llist->inserirPosicao(figura1,j);
                        inserido=1;
                    }
                    aux2=aux2->next;
                    j++;
                }
            }
            aux1=aux1->next;
        }
        this->List->head.next = llist->head.next;
    }
}

/*                FIM GERENCIADOR                       */
/*                                                      */
/********************************************************/
/********************************************************/
